package zj.it.bhne.gridengineeringsurvey;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.support.multidex.MultiDex;

import com.baidu.mapapi.SDKInitializer;
import com.blankj.utilcode.util.SPUtils;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;

import java.util.LinkedList;

import zj.it.bhne.gridengineeringsurvey.myutils.greendao.DaoMaster;
import zj.it.bhne.gridengineeringsurvey.myutils.greendao.DaoSession;
import zj.it.bhne.gridengineeringsurvey.myutils.greendao.EquipmentDao;
import zj.it.bhne.gridengineeringsurvey.myutils.greendao.ItemsDao;
import zj.it.bhne.gridengineeringsurvey.myutils.greendao.LineDao;
import zj.it.bhne.gridengineeringsurvey.myutils.greendao.OnlineDao;
import zj.it.bhne.gridengineeringsurvey.myutils.greendao.PhotosDao;
import zj.it.bhne.gridengineeringsurvey.myutils.greendao.PointsDao;

/**
 * 使用GreenDao必须初始化
 */
public class MyApplication extends Application {

    //静态单例
    @SuppressLint("StaticFieldLeak")
    private static MyApplication instances;
    private SQLiteDatabase db;
    private DaoSession mDaoSession;
    public LinkedList<Activity> activityLinkedList = new LinkedList<>();

    public static MyApplication getInstances() {
        return instances;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        SDKInitializer.initialize(instances);
        setInit();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }

    /**
     * 初始化
     */
    private void setInit() {
        new Thread(() -> {
            //设置线程的优先级，不与主线程抢资源
            setDatabase();
            //FrameHttpHelper.init(new OkhttpFrameProcessor());
            //子线程初始化第三方组件
            try {
                Thread.sleep(3000);//建议延迟初始化，可以发现是否影响其它功能，或者是崩溃！
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

    }

    public void addActivity(Activity activity){
        activityLinkedList.add(activity);
    }

    public void exit(){
        try {
            for (int i = 0; i < activityLinkedList.size(); i++) {
                activityLinkedList.get(i).finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.exit(0);
        }
    }

    /**
     * 设置greenDao
     */
    private void setDatabase() {
        // 通过 DaoMaster 的内部类 DevOpenHelper，你可以得到一个便利的 SQLiteOpenHelper 对象。
        // 可能你已经注意到了，你并不需要去编写「CREATE TABLE」这样的 SQL 语句，因为 greenDAO 已经帮你做了。
        // 注意：默认的 DaoMaster.DevOpenHelper 会在数据库升级时，删除所有的表，意味着这将导致数据的丢失。
        // 所以，在正式的项目中，你还应该做一层封装，来实现数据库的安全升级。
        DaoMaster.DevOpenHelper mHelper = new DaoMaster.DevOpenHelper(this, "engineer-db", null);
        db = mHelper.getWritableDatabase();
        // 注意：该数据库连接属于 DaoMaster，所以多个 Session 指的是相同的数据库连接。
        DaoMaster mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }

    public boolean IsLogin(){
        return "1".equals(SPUtils.getInstance().getString("islogin"));
    }

    /**
     * 数据库相关
     * @return DaoSession
     */
    public DaoSession getDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }

    public ItemsDao getItemsDao(){
        return getInstances().getDaoSession().getItemsDao();
    }

    public PointsDao getPointsDao(){
        return getInstances().getDaoSession().getPointsDao();
    }

    public EquipmentDao getEquipmentDao(){
        return getInstances().getDaoSession().getEquipmentDao();
    }

    public PhotosDao getPhotosDao(){
        return getInstances().getDaoSession().getPhotosDao();
    }

    public LineDao getLineDao(){
        return getInstances().getDaoSession().getLineDao();
    }

    public OnlineDao getOnlineDao(){
        return getInstances().getDaoSession().getOnlineDao();
    }


    //static 代码段可以防止内存泄露
    static {
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator((context, layout) -> {
            layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//全局设置主题颜色
            return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header，默认是 贝塞尔雷达Header
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator((context, layout) -> {
            //指定为经典Footer，默认是 BallPulseFooter
            return new ClassicsFooter(context).setDrawableSize(20);
        });
    }

}
